package com.cy.java.api.reflect;

import javax.sound.midi.Soundbank;
import java.lang.annotation.*;

/**自己定义的注解
 * @Retention注解用于描述定义的注解何时有效(运行时,编译时)
 * @Target注解用于描述这个纾解可以描述那些成员(类,属性,方法)
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Component{//@interface描述的类型为注解类型(本质上是一个特殊的接口)

}
@Component
class ClassA{}
public class AnnotationTests {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
     //检查classA上是否有@Component注解描述
        //1.获取类的字节码对象
        Class<?> cls=Class.forName("com.cy.java.api.reflect.ClassA");
        //2.判断对象上是否有@Component注解
        boolean flag=cls.isAnnotationPresent(Component.class);
        System.out.println(flag);
        //构建classA的实例com.cy.java.api.reflect.ClassA@610455d6
        if (flag){
            Object ob1=cls.newInstance();//反射构建类的实例
            System.out.println(ob1);

        }
        //还可以采用如下方式判定类上是否有指定注解
        // Annotation是所有注解的父类类型
        Annotation atn=cls.getAnnotation(Component.class);
//        System.out.println(atn);
              if (atn!=null){

              }
    }
}
